﻿#include "study07.h"
// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170

namespace string_util {
    void print_str(string str) {
        cout << "打印字符串：" << str << endl;
    }
}

namespace char_pointer_util {
    int X = 0;
    void print_str(const char* str) {
        string temp = str;
        reverse(temp.begin(), temp.end());  // string 支持迭代器
        cout << "逆向打印字符：" << temp << endl;
    }
}

namespace out_name {

    namespace inner_name {
        int add(int a, int b) { return a + b; }

        int sub(int a, int b) { return a - b; }

        int mul(int a, int b) { return a * b; }

        int div(int a, int b) { return a / b; } // 整数除法
    }

    float add(float a, float b) { return a + b; }

    float sub(float a, float b) { return a - b; }

    float mul(float a, float b) { return a * b; }

    float div(float a, float b) { return a / b; } // 浮点数除法
}

void test_namespace() {
    print_start("命名空间测试");
    string_util::print_str("Hello, world!");
    char_pointer_util::print_str("Hello, world!");
    {
        using namespace string_util;
        using namespace char_pointer_util;
        print_str("123456789");  // const char* 到 string 会有隐式转换，所以 char_pointer_util 更匹配
    }
    char_pointer_util::X = 10;  // 命名空间内部的变量可以直接访问
    cout << "char_pointer_util::X = " << char_pointer_util::X << endl;

    // 命名空间嵌套的使用
    cout << "out_name::inner_name::add(1, 2) = " << out_name::inner_name::add(1, 2) << endl;
    cout << "out_name::inner_name::add(1.0f, 2.0f) = "
        << out_name::inner_name::add(1.4f, 2.4f) << endl; // 3
    // 单独使用命名空间一个成员
    namespace a = out_name;  // 别名
    using a::inner_name::div;
    cout << "div(10, 3) = " << div(10, 3) << endl;  // 3
    print_end("命名空间测试");
}